package conector;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class mysql {

	private static Connection conexion;

    static logs.generador logs = new logs.generador();
    static utils.defines defines = new utils.defines();
    
	public static void query(String queryString){
		conexionMysql(); //conectar
        //realizar consulta
        try {
            // Preparamos la consulta
            Statement s = conexion.createStatement();
            ResultSet rs = s.executeQuery (queryString);
            // Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla.
            while (rs.next()){
                System.out.println( "id: " +rs.getTimestamp(6));
            }
        } catch (SQLException ex) {
            System.out.println("Imposible realizar consulta ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        //cerrarConexionMysql();
    }
	
	public static ResultSet queryObj(String queryString){
        //conectar
		conexionMysql();
        //realizar consulta
        try {
            // Preparamos la consulta
            Statement s = conexion.createStatement();
            ResultSet rs = s.executeQuery (queryString);
            // Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla.
            return rs;
        } catch (SQLException ex) {
            System.out.println("Imposible realizar consulta ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        //cerrarConexionMysql();
		return null;
    }
	
	public static void executeUpdate(String queryString) throws SQLException{
		conexionMysql();
		String updateQuery = queryString;
		PreparedStatement ps = null;
		ps = conexion.prepareStatement(updateQuery);
		ps.executeUpdate();
		//cerrarConexionMysql();
	}
	
	public static void executeUpdateSinBBDD(String queryString) throws SQLException{
		conexionMysqlSinBBDD();
		String updateQuery = queryString;
		PreparedStatement ps = null;
		ps = conexion.prepareStatement(updateQuery);
		ps.executeUpdate();
		//cerrarConexionMysql();
	}
	
	public static void dropTabla(String tabla) throws SQLException{
		String queryString = "DROP TABLE "+tabla;
		executeUpdate(queryString);
	}
	
	/*
	 * 
	 * 
	 */
	
	private static void conexionMysql(){
		try {
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(defines.serverConBD,defines.user,defines.password);
//            System.out.println("Conexión a base de datos "+server+" ... OK");
        } catch (ClassNotFoundException ex) {
            System.out.println("Error cargando el Driver MySQL JDBC ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            System.out.println("Imposible realizar conexion con "+defines.serverConBD+" ... FAIL");
           //Logger.getLogger(Main.class.getName()).log( null, ex);
        }
	}
	
	public static void cerrarConexionMysql(){
		 //desconectar
        try {
            conexion.close();
//            System.out.println("Cerrar conexion con "+server+" ... OK");
        } catch (SQLException ex) {
            System.out.println("Imposible cerrar conexion ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
	}
		
	public int contarRegistros(String tabla) throws SQLException{
		String queryString = "SELECT COUNT(id) as resultado FROM "+tabla;
		ResultSet resultSet = mysql.queryObj(queryString);
		while (resultSet.next()){
			int valor =  resultSet.getInt("resultado");
			return valor;
		}
		return 0;
	}

	/*
	 * 
	 * 
	 * 
	 */

	public void comprobarBaseDatos() throws Exception {
		conexionMysqlSinBBDD();
		comprobarBaseDatosAplicacion();
		cerrarConexionMysql();
	}
	
	private static void conexionMysqlSinBBDD(){
		try {
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(defines.server,defines.user,defines.password);
//            System.out.println("Conexión a base de datos "+server+" ... OK");
        } catch (ClassNotFoundException ex) {
            System.out.println("Error cargando el Driver MySQL JDBC ... FAIL");
            //Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            System.out.println("Imposible realizar conexion con "+defines.server+" ... FAIL");
           //Logger.getLogger(Main.class.getName()).log( null, ex);
        }
	}
	
	public static ResultSet comprobarBaseDatosAplicacion() throws Exception{
	        //conectar
			String queryString ="SELECT EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = "+
						        	 			"'"+defines.bd+"')"+
						        	 			"AS resultado";
	            Statement s = conexion.createStatement();
	            ResultSet rs = s.executeQuery (queryString);

	            while (rs.next()){
	    			boolean valor =  rs.getBoolean("resultado");
	    			if(valor == false){
	    				logs.escribir("BASE DE DATOS "+defines.bd+" NO EXISTE");
	    				//crearBaseDatosAplicacion();
	    				logs.escribir("BASE DE DATOS "+defines.bd+" CREADA");
	    			}
	            }	
			return null;
		}

	public static void crearBaseDatosAplicacion(String bd) throws SQLException {
			String queryString = "CREATE SCHEMA "+bd+" "+
								 "DEFAULT CHARACTER SET utf8 "+
								 "COLLATE utf8_spanish_ci ";
			mysql.executeUpdate(queryString);
	}
	
	public boolean comprobacionBaseDatos() throws SQLException{
		String queryString = "SELECT IF('"+defines.bd+"' IN(SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA),TRUE,FALSE) AS existe";
		ResultSet resultSet = mysql.queryObj(queryString);
		while (resultSet.next()){
			boolean valor =  resultSet.getBoolean("existe");
			return valor;
		}
		return false;
	}
	
	public void crearIndicesBaseDatos() throws SQLException{
		String index1 = "ALTER TABLE "+defines.bd+".`poblaciones` ADD INDEX `GET_CLUB` (`id`, `id_provincia`, `poblacion`); ";
		mysql.executeUpdate(index1);
		String index2 = "ALTER TABLE "+defines.bd+".`equipos` ADD INDEX `GET_EQUIPO_COMPETICION` (`id_categoria`, `id_competicion`, `temporada`), ADD INDEX `EQUIPO_UNICO_1` (`id_club`, `id_categoria`, `id_competicion`);";
		mysql.executeUpdate(index2);
		String index3 = "ALTER TABLE "+defines.bd+".`equipos` ADD INDEX `EQUIPO_UNICO_2` (`id_club`, `id_competicion`, `temporada`);";
		mysql.executeUpdate(index3);
		String index4 = "ALTER TABLE "+defines.bd+".`partidos` ADD INDEX `subquery1` (`id_equipo_local`, `id_categoria`, `id_competicion`, `jornada`), ADD INDEX `subquery2` (`id_equipo_visitante`, `id_categoria`, `id_competicion`, `jornada`);";
		mysql.executeUpdate(index4);
		String index5 = "ALTER TABLE "+defines.bd+".`partidos` ADD INDEX `subquery3` (`id_categoria`, `id_competicion`);";
		mysql.executeUpdate(index5);
		String index6 = "ALTER TABLE "+defines.bd+".`clasificaciones` ADD INDEX `clasificaciones1` (`id_equipo`, `id_categoria`, `id_competicion`, `temporada`);";
		mysql.executeUpdate(index6);

	}

	public void dropDatabase() throws SQLException, IOException{
		String queryString = "DROP DATABASE "+defines.bd;
		mysql.executeUpdate(queryString);
		
	}

	public void crearBaseDatos() throws SQLException {
		String queryString = "CREATE DATABASE `"+defines.bd+"`CHARACTER SET utf8 COLLATE utf8_spanish_ci;";
		mysql.executeUpdateSinBBDD(queryString);		
	}
}
